
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2009, Perry L Miller IV
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  Node representing a line.
//
///////////////////////////////////////////////////////////////////////////////

#include "SceneGraph/Nodes/Shapes/Line.h"

using namespace SceneGraph::Nodes::Shapes;


///////////////////////////////////////////////////////////////////////////////
//
//  Construction
//
///////////////////////////////////////////////////////////////////////////////

Line::Line() : BaseClass(),
  _start ( Vector ( 0, 0, 0 ) ),
  _end   ( Vector ( 1, 0, 0 ) )
{
}
Line::Line ( const Vector &start, const Vector &end ) : BaseClass(),
  _start ( start ),
  _end   ( end )
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor.
//
///////////////////////////////////////////////////////////////////////////////

Line::~Line()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the start.
//
///////////////////////////////////////////////////////////////////////////////

void Line::startSet ( const Vector &start )
{
  _start = start;
  this->dirtyBounds ( true, true );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the radius.
//
///////////////////////////////////////////////////////////////////////////////

Line::Vector Line::startGet() const
{
  return _start;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the end.
//
///////////////////////////////////////////////////////////////////////////////

void Line::endSet ( const Vector &end )
{
  _end = end;
  this->dirtyBounds ( true, true );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the radius.
//
///////////////////////////////////////////////////////////////////////////////

Line::Vector Line::endGet() const
{
  return _end;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Update the bounding sphere.
//
///////////////////////////////////////////////////////////////////////////////

void Line::_updateBoundingSphere()
{
  Usul::Math::Vec3d c ( 0, 0, 0 );
  this->boundingSphereSet ( BoundingSphere 
    ( true, Usul::Math::Sphered::bounds ( Vector ( _start ), Vector ( _end ) ) ) );
  this->dirtyBounds ( false, false );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Update the bounding box.
//
///////////////////////////////////////////////////////////////////////////////

void Line::_updateBoundingBox()
{
  this->boundingBoxSet ( BoundingBox ( _start, _end ) );
  this->dirtyBounds ( false, false );
}
